//
//  HomeViewController.swift
//  上海微博
//
//  Created by 🍃叶子 on 16/4/15.
//  Copyright © 2016年 🍃叶子. All rights reserved.
//

import UIKit

/// 微博 Cell 可重用标识符
private let CZStatusCellID = "cell"

class HomeViewController: RootViewController {
    
    
    
    
    override func viewDidLoad() {
        
        setupRefreshControl()
        // 调用 RootViewController的ViewDidLoad函数,会直接调用loadData
        super.viewDidLoad()
        
        // 注册可重用 cell
        tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: CZStatusCellID)
        
        // 设置访客信息图 - 如果用户登录成功,访客视图为nil,什么也不做!
        visitorViewTwo?.setupInfo(message: "关注一些人,回这里看看有什么惊喜 ")
    }
    
    /// 接收到内存警告!
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

        // On iOS 6.0 it will no longer clear the view by default.
        // 在iOS 6.0 之后,默认不再清除view,再 iOS 6.0 之前,收到内存警告后
        // '如果视图当前没有显示',会被从内存中销毁,下次需要使用的时候,会再次调用 loadView 创建 View
        // 只需要释放能够被再次创建的资源,例如: 从网络加载的数据数组
        // 图像的内存管理 SDWebImage 自行管理,会释放内存中的图像,会重新从磁盘缓存加载,如果磁盘缓存没有,下载图片
        // 所有手动释放:子控件不要释放了,释放数据就行了
        
        print("Home的 window\(self.view.window)")
        // 如果视图正在显示,window不为nil
        // 注意: Swift 中 lazy 的属性 千万不要设置成nil !
        if self.view.window == nil {
            // 1.清理数组
            self.dataList.removeAll()
            // 2.刷新数据
            self.loadData() 
        }

    }
    
    override func loadData() {
        
        // 默认起始索引值
        let defaultIndex = 100
        
        // 1.判断是否是上拉刷新,如果上拉刷新动画启动,认为是上拉刷新
        let isPullup = pullupView.isAnimating()
        
        // 不是上拉刷新就是下拉...就启动图片
        if !isPullup {
            refreshController.beginRefreshing()
        }
        
        // 模拟异步加载数据
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            
            // 模拟网络延迟 - 同步的,不执行完成,不会执行后续代码
            // 阻塞线程/当前线程在睡眠期间,不响应任何时间!
            // 提示:商业应用千万不要使用!仅用来测试的
            NSThread.sleepForTimeInterval(1.0)
            
            // 下拉属性索引,获取数组的第 0 条数据数值
            let pulldownIndex = self.dataList.first ?? defaultIndex
            
            // 上拉刷新索引,获取数组的最后一条记录数值
            let pullupIndex = self.dataList.last ?? 0
            
            // 如果上拉,顺序加载数据,如果下拉,倒叙
            var arrayM = [Int]()
            if isPullup{
                for i in 0..<10{
                    arrayM.append(pullupIndex - i - 1)
                }
            }else{
                // 模拟网络一次加载的数据
                for i in (0..<10).reverse() {
                    arrayM.append(i + pulldownIndex + 1)
                }
            }
            
            // TODD: - 上拉刷新,将数据追加到数组末尾
            if isPullup{
                self.dataList += arrayM
            }else{
                // 下拉刷新要插入到现有的 dataList 的前面
                self.dataList = arrayM + self.dataList
                // 这个插入数据..??
                //dataList.insert(newElement: Int, atIndex: 0
            }

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                // 关闭刷新
                self.refreshController.endRefreshing()
                
                // 停止上拉刷新的动画
                self.pullupView.stopAnimating()
                
                // 刷新数据
                self.tableView.reloadData()
                
                
            })
        }
        
        
        
    }
    
    // MARK: - 私有属性
    private lazy var dataList = [Int]()
    
}


// MARK: - UITableViewDataSource
// Redundant conformance of 'HomeViewController' to protocol 'UITableViewDataSource'
// 重复遵守协议: 父类已经遵守协议,子类不用再次遵守协议,否则会报这个错误
extension HomeViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataList.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(CZStatusCellID, forIndexPath: indexPath)
        
        //cell.textLabel?.text = String(indexPath.row) // 同 "\(indexPath.row)"
        // description --> 对结构体,对象的描述可以直接用description这个方法
        //cell.textLabel?.text = indexPath.row.description
        cell.textLabel?.text = dataList[indexPath.row].description
        
        return cell
    }
    
}




